﻿/// <reference path="prototype.js" />

/* 
=== Classe Comet ===
Cette classe se charge de gérer une connection Comet sur un serveur spécifiée dans le constructeur

Le serveur Comet doit à minima :

- réagir à la variable action="waitformessages" passée en POST en se mettant dans une boucle infinie 
et en ne retournant que lorsqu'un nouveau message est arrivé
          
Toutes les variables sont passées en POST, en encodées en JSON
===================

Auteurs : Jean Guillou et Grégory Schlomoff
Auteur original : Stéphane Zeitoun (http://www.zeitoun.net/articles/comet_and_php/start)
*/

var Comet = Class.create({

				initialize: function(url) {
								this.url = url;
								this.errors = 0;
				},

				setConnectionParams: function(connectParams) {
								this.connectParams = connectParams;
								this.connect();
				},

				connect: function() {

								this.ajax = new Ajax.Request(this.url, {
												method: "post",
												parameters: this.connectParams,

												onSuccess: (function(transport) {
																// handle the server response
																
																if(transport.responseText.substr(0,4) == "{ok}") {
																  var msg = transport.responseText.substr(4)
																  try{
																    msg = msg.evalJSON();
																    document.fire("comet:newmessage", msg); 
																    this.errors = 0;
																  } catch(err) {
																    this.errors++;
																  }
																} else {
                                  if(console) console.error("Error from Comet server : " + transport.responseText);
																  this.errors++;																
																}
												}).bind(this),

												onComplete: (function(transport) {
																// send a new ajax request when this request is finished
																
																if(this.errors == 0) {
																  this.connect();
															  } else {
															    if(this.errors < 5)
															      // retry 3 times, waiting 2 seconds before each retry
															      setTimeout(this.connect.bind(this), 2000);
															  }
																this.errors++;
												}).bind(this)
								});
				},

				sendMessage: function(request, onSuccess) {
								new Ajax.Request(this.url, {
												method: "post",
												parameters: request,
												onSuccess: onSuccess
								});
				}
});

